package com.ruoyi.framework.mybatisplus.strategy.strategies;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.ruoyi.framework.mybatisplus.OperateSymbol;
import com.ruoyi.framework.mybatisplus.strategy.AbstractQueryStrategy;

import java.lang.reflect.Field;

/**
 * 排序查询策略实现类
 * 用于处理排序查询条件
 * 字段名需要以"Sort"结尾才会匹配此策略
 * 字段值必须是字符串类型，且值为"DESC"（不区分大小写）时表示降序，其他值表示升序
 * 
 * @author xuzhen97
 */
public class SortStrategy extends AbstractQueryStrategy {
    
    /**
     * 构造函数
     * 设置操作符为排序（SORT）
     */
    public SortStrategy() {
        super(OperateSymbol.SORT);
    }

    /**
     * 应用查询条件
     * 根据字段值决定添加升序还是降序条件
     * 如果值为"DESC"（不区分大小写），添加降序条件
     * 其他值添加升序条件
     * 
     * @param prefix 字段前缀
     * @param obj 查询对象
     * @param key 字段名
     * @param field 字段对象
     * @param wrapper 查询包装器
     */
    @Override
    public void apply(String prefix, Object obj, String key, Field field, AbstractWrapper wrapper) {
        String fieldName = getFieldName(key, field);
        Object value = getValue(obj, field);
        if (isValidValue(value)) {
            if (ObjectUtil.equal(String.valueOf(value).toUpperCase(), "DESC")) {
                wrapper.orderByDesc(prefix + fieldName);
            } else {
                wrapper.orderByAsc(prefix + fieldName);
            }
        }
    }
} 